<?php
/**
 * 【观察者模式适用场景】
当一个抽象模型有两个方面，其中一个方面依赖于另一个方面。
当对一个对象的改变需要同时改变其它对象，而不知道具体有多少个对象待改变。
当一个对象必须通知其它对象，而它又不能假定其它对象是谁。换句话说，你不希望这些对象是紧密耦合的。
 * Created by PhpStorm.
 * User: liangtiehui
 * Date: 2016/4/19
 * Time: 8:04
 */

namespace Observer;

include_once 'Observer.php';
include_once 'ConcreteObserver.php';
include_once 'Subject.php';
include_once 'ConcreteSubject.php';

/**
 * 客户端测试
 * Class Client
 * @package Observer
 */
class Client
{
    public static function main()
    {
        $subject = new ConcreteSubject();

        /* 添加第一个观察者 */
        $observer1 = new ConcreteObserver('test1');
        $subject->attach($observer1);

        echo '<br/>The First notify;<br/>';
        $subject->notifyObservers();

        /* 添加第二个观察者 */
        $observer2 = new ConcreteObserver('test2');
        $subject->attach($observer2);

        echo '<br/>The Second notify;<br/>';
        $subject->notifyObservers();

        /* 删除第一个观察者 */
        $subject->detach($observer1);

        echo '<br/>The Third notify;<br/>';
        $subject->notifyObservers();
    }
}

Client::main();